package com.firewolf.shiro.web.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/user")
public class UserController {

	/**认证流程：
	 *  1. 获取当前的 Subject. 调用 SecurityUtils.getSubject();
		2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated() 
		3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象
			1). 创建一个表单页面
			2). 把请求提交到 SpringMVC 的 Handler
			3). 获取用户名和密码. 
		4. 执行登录: 调用 Subject 的 login(AuthenticationToken) 方法. 
		5. 自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro.
			1). 实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类
			2). 实现 doGetAuthenticationInfo(AuthenticationToken) 方法. 
		6. 由 shiro 完成对密码的比对. 
	 */
	
	
	@RequestMapping("/login")
	public String hello1(@RequestParam("username") String username, @RequestParam("password") String password) {
		// Subject subject = SecurityUtils.getSubject();
		// subject.checkRole("admin");

		Subject currentUser = SecurityUtils.getSubject();

		if (!currentUser.isAuthenticated()) {
			// 把用户名和密码封装为 UsernamePasswordToken 对象
			UsernamePasswordToken token = new UsernamePasswordToken(username, password);
			// rememberme
			token.setRememberMe(true);
			try {
				System.out.println("1. " + token.hashCode());
				// 执行登录.
				currentUser.login(token);
			}
			// ... catch more exceptions here (maybe custom ones specific to
			// your application?
			// 所有认证时异常的父类.
			catch (AuthenticationException ae) {
				// unexpected condition? error?
				System.out.println("登录失败: " + ae.getMessage());
			}
		}

		return "redirect:/list.jsp";
	}
	
	@RequiresRoles(value={"admin"})
	@RequestMapping("/testAnnotation")
	public String testAnnotation(){
		System.out.println("Test Annotation");
		return "redirect:/annotation.jsp";
	}

}
